package com.zhenwei.zscm.repo;

import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhenwei.zscm.common.base.MybatisWrapper;
import com.zhenwei.zscm.common.utils.Linq;
import com.zhenwei.zscm.entity.DictEntity;
import com.zhenwei.zscm.mapper.IDictMapper;
import com.zhenwei.zscm.mappings.DictMapping;
import com.zhenwei.zscm.model.dto.dict.DictDTO;
import com.zhenwei.zscm.model.vo.dict.DictVO;
import com.zhenwei.zscm.model.vo.dict.QueryDictVO;
import org.springframework.stereotype.Service;

import java.util.List;

/**
* @author DuckyYang
* @description 针对表【dict】的数据库操作Service实现
* @createDate 2025-05-22 09:40:46
*/
@Service
public class DictRepo extends ServiceImpl<IDictMapper, DictEntity> {
    public List<DictDTO> getList(String dictType) {
        var q = new LambdaQueryWrapper<DictEntity>()
                .eq(DictEntity::getDictType, dictType)
                .eq(DictEntity::getDeleted, false)
                .orderByAsc(DictEntity::getOrderBy);
        var list = this.list(q);
        return Linq.mapList(list, DictMapping.INSTANCE::entity2dto);
    }
    public List<DictDTO> page(QueryDictVO query) {
        var q = new LambdaQueryWrapper<DictEntity>()
                .eq(DictEntity::getDictType, query.getDictType())
                .eq(DictEntity::getDeleted, false)
                .orderByAsc(DictEntity::getOrderBy);
        var p = new Page<DictEntity>(query.getPageNo(), query.getPageSize(), true);
        var page = this.page(p, q);
        query.setTotalCount(page.getTotal());
        return Linq.mapList(page.getRecords(), DictMapping.INSTANCE::entity2dto);
    }
    public boolean addDict(DictVO vo){
        DictEntity e = DictMapping.INSTANCE.vo2entity(vo);
        e.setGuid(IdUtil.simpleUUID());
        return this.save(e);
    }

    public DictDTO getDict(String code, String dictType) {
        var q = new LambdaQueryWrapper<DictEntity>()
                .eq(DictEntity::getCode, code)
                .eq(DictEntity::getDictType, dictType)
                .eq(DictEntity::getDeleted, false);
        var list = this.list(q);
        return Linq.getFirst(list, DictMapping.INSTANCE::entity2dto);
    }

    public boolean update(DictVO vo) {
        var u = new LambdaUpdateWrapper<DictEntity>()
                .eq(DictEntity::getCode, vo.getCode())
                .eq(DictEntity::getDictType, vo.getDictType())
                .eq(DictEntity::getDeleted, false)
                .set(DictEntity::getName, vo.getName())
                .set(DictEntity::getOrderBy, vo.getOrderBy());
        MybatisWrapper.fillUser(u);
        return this.update(u);
    }

    public boolean delete(DictVO vo){
        var u = new LambdaUpdateWrapper<DictEntity>()
                .eq(DictEntity::getCode, vo.getCode())
                .eq(DictEntity::getDictType, vo.getDictType())
                .eq(DictEntity::getDeleted, false)
                .set(DictEntity::getDeleted, true);
        MybatisWrapper.fillUser(u);
        return this.update(u);
    }

    public List<String> getDictType(){
        var q = new LambdaQueryWrapper<DictEntity>()
                .eq(DictEntity::getDeleted, false)
                .select(DictEntity::getDictType)
                .groupBy(DictEntity::getDictType);
        var list = this.list(q);
        return Linq.mapList(list, DictEntity::getDictType);
    }
}




